/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ve.usb.cep.actions;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.HashMap;
import com.google.gson.Gson;
import java.util.ArrayList;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;

import ve.usb.cep.db.SelectObject;
import ve.usb.cep.db.domainObjects.Usuario;
import ve.usb.cep.db.models.UsuarioModel;
import ve.usb.cep.db.modelExceptions.UsuarioException;
import ve.usb.cep.util.sqlWhere;
/**
 *
 * @author Andras
 */
public class UsuarioA extends ActionSupport{

    //Salida por texto
    protected String output;
    protected String error;
    protected HashMap err = new HashMap();


    @Override
    public String execute(){

        if (!"Administrador".equals(user().getRol())){
            error = "Sólo administradores pueden gestionar usuarios";
            return ERROR;
        }

        return SUCCESS;
    }


    public String crear(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para crear usuarios");
            return _finish();
        }

        return editar();
    }

    public String editar(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para modificar usuarios");
            return _finish();
        }

        try{
            Usuario o = _createDomainObject(), exist;
            if (null != o){
                try{
                    exist = new UsuarioModel().getUniqueCorreo(o.getCorreo(), o.getCodigo());
                }catch(UsuarioException e){
                    return _finishWithExceptions(e);
                }
                if (null != exist){
                    err.put("Correo", "Ya existe un usuario (" +
                            exist.getNombre() + ' ' + exist.getApellido() +
                            ") registrado con ese correo.");
                };

                try{
                    exist = new UsuarioModel().getUniqueCedula(o.getCedula(), o.getCodigo());
                }catch(UsuarioException e){
                    return _finishWithExceptions(e);
                }
                if (null != exist){
                    err.put("Cédula", "Ya existe un usuario (" +
                            exist.getNombre() + ' ' + exist.getApellido() +
                            ") registrado con esa cédula.");
                };
            }
            if (!err.isEmpty()){
                return _finish();
            }
            new UsuarioModel().set(o);
        }catch(UsuarioException e){
            return _finishWithExceptions(e);
        }
        return _finish();
    }

    public String listar(){
        UsuarioModel u = new UsuarioModel();
        SelectObject s;
        ArrayList<Usuario> usuarios;
        int rowCount;
        try{
            s = _createSearchObject();
            if (!err.isEmpty()){
                return _finish();
            }
            usuarios = u.getCustom(s);
            rowCount = u.getRowCount();
        }catch (UsuarioException e){
            return _finishWithExceptions(e);
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap[] m = new HashMap[usuarios.size()];
        int i = 0;

        for (Usuario o : usuarios){
            String[] c = new String[9];
            c[0] = o.getNombre();
            c[1] = o.getApellido();
            c[2] = "******";
            c[3] = Integer.toString(o.getCedula());
            c[4] = o.getRol();
            c[5] = o.getTelefono();
            c[6] = o.getCorreo();
            c[7] = o.getPregunta();
            c[8] = o.getRespuesta();
            HashMap e = new HashMap();
            e.put("id", o.getCodigo());
            e.put("cell", c);
            m[i] = e;

            ++ i;
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / (double) s.getRows()));
        r.put("page", s.getPage());
        r.put("records", s.getRows());
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }

    public String eliminar(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para eliminar usuarios");
            return _finish();
        }

        HttpServletRequest r = ServletActionContext.getRequest();
        int codigo = 0;
        try{
            codigo = Integer.parseInt(r.getParameter("id"));
        }catch(java.lang.NumberFormatException e){
            err.put("Código", "El registro con el número '" + r.getParameter("id") + "' no existe.");
        }

        if (!err.isEmpty()){
            return _finish();
        }

        try{
            new UsuarioModel().delete(codigo);
            return _finish();
        }catch (UsuarioException e){
            return _finishWithExceptions(e);
        }
    }

    protected Usuario _createDomainObject()
        throws UsuarioException
    {

        HttpServletRequest r = ServletActionContext.getRequest();

        int codigo = -1;
        if ("_empty".equals(r.getParameter("id"))){
            codigo = 0;
        }else{
            try{
                codigo = Integer.parseInt(r.getParameter("id"));
            }catch(java.lang.NumberFormatException e){
                err.put("Codigo", "Número de registro inválido");
            }
        }

        int cedula = -1;
        try{
            cedula = Integer.parseInt(r.getParameter("cedula"));
            if (cedula < 0){
                err.put("Cédula", "El número de cédula no puede ser negativo");
            }
        }catch(java.lang.NumberFormatException e){
            err.put("Cédula", "Número de cédula inválido");
        }

        return new Usuario(
            codigo,
            r.getParameter("nombre"),
            r.getParameter("apellido"),
            r.getParameter("clave"),
            cedula,
            r.getParameter("rol"),
            r.getParameter("telefono"),
            r.getParameter("correo"),
            r.getParameter("pregunta"),
            r.getParameter("respuesta")
        );
    }

    protected SelectObject _createSearchObject(){

        HttpServletRequest r = ServletActionContext.getRequest();
        sqlWhere w = (sqlWhere) new Gson().fromJson(
                r.getParameter("filters"), sqlWhere.class);
        if (null == w){
            w = new sqlWhere();
        }

        short rows = 20, page = 1;
        try{
            rows = (short) Integer.parseInt(r.getParameter("rows"));
            page = (short) Integer.parseInt(r.getParameter("page"));
        }catch(java.lang.NumberFormatException e){
            
        }
        return new SelectObject(
            rows,
            page,
            r.getParameter("sidx"),
            r.getParameter("sord"),
            w
        );
    }

    protected String _finishWithExceptions(Exception e){
        ServletActionContext.getResponse()
                .setStatus(HttpServletResponse.SC_BAD_REQUEST);

        //Para los casos en los que el error sea interno, err estará vacío.
        if (null != e){
            e.printStackTrace();
            err.put("error interno", e.getMessage());
            output = new Gson().toJson(err);
        }
        return ERROR;
    }

    protected String _finish(){
        if (!err.isEmpty()){
            ServletActionContext.getResponse()
                .setStatus(HttpServletResponse.SC_BAD_REQUEST);
            output = new Gson().toJson(err);
            return ERROR;
        }

        return SUCCESS;
    }

    protected Usuario user(){

        Usuario u = (Usuario) ActionContext.getContext().getSession().get("user");
        if (null == u){
            u = new Usuario(0, "", "", "", 0, "Visitante", "", "", "", "");
        }
        return u;
    }

    //Output, salida estándar por texto
    public String getOutput() {
        return output;
    }

    public String getError(){
        return error;
    }
}
